//package com.pss.common.config;
//
//
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.config.BeanPostProcessor;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.util.ReflectionUtils;
//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
//import springfox.documentation.builders.PathSelectors;
//import springfox.documentation.builders.RequestHandlerSelectors;
//import springfox.documentation.service.ApiInfo;
//import springfox.documentation.service.Contact;
//import springfox.documentation.spi.DocumentationType;
//import springfox.documentation.spring.web.plugins.Docket;
//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
//
//import java.lang.reflect.Field;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * Swagger3配置
// * 说明：
// * @EnableOpenApi 注解启动用Swagger的使用，同时在配置类中对Swagger的通用参数进行配置
// */
//@Configuration
//public class Swagger3Config {
//
//    /**
//     * 说明：
//     *
//     *          // RequestHandlerSelectors.basePackage 指定包下文件开启 swagger
//     *         // RequestHandlerSelectors.any() 所以包下文件开启 swagger
//     *         // RequestHandlerSelectors.none() 所有包下文件都不开启 swagger
//     *         // RequestHandlerSelectors.withClassAnnotation() 扫描有指定注解的类
//     *
//     *
//     *         // PathSelectors.ant() 扫描指定目录下的文件
//     *         // PathSelectors.any() 扫描所有文件
//     *         // PathSelectors.none() 所有文件都不扫描
//     *         // PathSelectors.regex() 按正则方式扫描文件
//     * @return
//     */
//    @Bean
//    public Docket getDocket() {
//        Docket docket = new Docket(DocumentationType.OAS_30);
//        docket.apiInfo(getApiInfo())
//                .groupName("后端服务接口")
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("cn.lat.lawservice"))
//                .paths(PathSelectors.ant("/lawservice/**"))
//                .build();
//        return docket;
//    }
//
//
//    protected ApiInfo getApiInfo(){
//        Contact contact = new Contact("乐土", "https://www.lat.cn", "jsb@lat.cn");
//
//        return new ApiInfo("乐土后端接口文档",
//                "乐土后端接口文档",
//                "1.0",
//                "https://www.lat.cn",
//                contact,
//                "Apache 2.0",
//                "http://www.apache.org/licenses/LICENSE-2.0",
//                new ArrayList());
//    }
//
//
//    /**
//     * 处理报错问题
//     * org.springframework.context.ApplicationContextException:
//     * Failed to start bean ‘documentationPluginsBootstrapper’;
//     * nested exception is java.lang.NullPointerException
//     *
//     * Springfox 设置 Spring MVC 的路径匹配策略是 ant-path-matcher，
//     * 而 Spring Boot 2.6.x版本的默认匹配策略是 path-pattern-matcher，这就造成了上面的报错
//     * @return
//     */
//    @Bean
//    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
//        return new BeanPostProcessor() {
//
//            @Override
//            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
//                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
//                }
//                return bean;
//            }
//
//            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
//                List<T> copy = mappings.stream()
//                        .filter(mapping -> mapping.getPatternParser() == null)
//                        .collect(Collectors.toList());
//                mappings.clear();
//                mappings.addAll(copy);
//            }
//
//            @SuppressWarnings("unchecked")
//            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
//                try {
//                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
//                    field.setAccessible(true);
//                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
//                } catch (IllegalArgumentException | IllegalAccessException e) {
//                    throw new IllegalStateException(e);
//                }
//            }
//        };
//    }
//
//}